package institution

import (
	"context"
	"errors"
	"feng-che.com/server/driver-quiz/internal/dep_db"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"mongoDB"
)

// Institution 考试机构 - 提供模拟考试服务
//
// TODO: 机构的工作日历、吃食安排
type Institution struct {
	mongoDB.MongoDefaultModelNonID `bson:"basic"`
	ID                             primitive.ObjectID `bson:"_id,omitempty" json:"id"`
	Name                           string             `bson:"name" json:"name"`               // 机构名称
	Address                        string             `bson:"address" json:"address"`         // 机构地址
	Latitude                       float64            `bson:"latitude" json:"latitude"`       // 机构纬度
	Longitude                      float64            `bson:"longitude" json:"longitude"`     // 机构经度
	Phone                          string             `bson:"phone" json:"phone"`             // 机构电话
	Email                          string             `bson:"email" json:"email"`             // 机构邮箱
	Website                        string             `bson:"website" json:"website"`         // 机构官网
	Description                    string             `bson:"description" json:"description"` // 机构描述
	Status                         int                `bson:"status" json:"status"`           // 机构状态
	Staffs                         []Staff            `bson:"staffs" json:"staffs"`           // 机构员工-用来管理不同人对于机构的权限
}

type Staff struct {
	ID         primitive.ObjectID `bson:"_id,omitempty" json:"id"`
	Permission []string           `bson:"permission" json:"permission"`
	Denied     []string           `bson:"denied" json:"denied"` // 拒绝的权限
}

func (inst *Institution) Save(ctx context.Context, updateOptions ...*options.UpdateOptions) (*mongo.UpdateResult, error) {
	if inst.ID.IsZero() {
		inst.ID = primitive.NewObjectID()
	}
	var opts []*options.UpdateOptions
	if len(updateOptions) > 0 && updateOptions[0] != nil {
		opts = updateOptions
	} else {
		opts = append(opts, options.Update().SetUpsert(true))
	}
	result, err := inst.GetCollection().UpdateByID(ctx, inst.ID, bson.D{
		{"$set", inst},
	}, opts...)
	return result, err
}

func (inst *Institution) Update(ctx context.Context, dataFields *bson.D, opts ...*options.UpdateOptions) error {
	if inst.ID.IsZero() {
		return errors.New("没有带入id")
	}
	*dataFields = append(*dataFields, bson.E{Key: "$set", Value: bson.D{*mongoDB.CommonUpdateTimeFieldWithCurrentTime()}})
	_, err := inst.GetCollection().UpdateByID(ctx, inst.ID, *dataFields, opts...)
	return err
}

func (inst *Institution) Delete(ctx context.Context) error {
	if inst.ID.IsZero() {
		return errors.New("没有带入id")
	}
	delFiled := bson.D{}
	fields := mongoDB.CommonDeleteWriteFields()
	for _, i2 := range *fields {
		delFiled = append(delFiled, i2)
	}
	return inst.Update(ctx, &bson.D{
		{"$set", delFiled},
	})
}

func (inst *Institution) GetCollectionName() *string {
	name := "institution"
	return &name
}

func (inst *Institution) GetCollection() *mongo.Collection {
	return dep_db.ObjectCollection(inst.GetCollectionName())
}
